package com.feri.sh.api.service.impl;

import cn.hutool.core.util.RandomUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.feri.sh.api.service.SmsService;
import com.feri.sh.api.util.AliSmsUtil;
import com.feri.sh.common.config.RedisKeyConfig;
import com.feri.sh.common.pojo.bo.PhoneCodeBo;
import com.feri.sh.common.pojo.vo.R;
import com.feri.sh.common.type.SmsType;
import com.feri.sh.core.dao.SmsDao;
import com.feri.sh.core.dao.UserDao;
import com.feri.sh.core.entity.auth.User;
import com.feri.sh.core.entity.third.Sms;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;

/**
 * ━━━━━━Feri出没━━━━━━
 * 　　　┏┓　　　┏┓
 * 　　┏┛┻━━━┛┻┓
 * 　　┃　　　　　　 ┃
 * 　　┃　　　━　　　┃
 * 　　┃　┳┛　┗┳　  ┃
 * 　　┃　　　　　　 ┃
 * 　　┃　　　┻　　　┃
 * 　　┃　　　　　　　┃
 * 　　┗━┓　　　┏━┛
 * 　　　　┃　　　┃    邢哥的代码，怎么会，有bug呢，不可能！
 * 　　　　┃　　　┃
 * 　　　　┃　　　┗━━━┓
 * 　　　　┃　　　　　　　┣┓
 * 　　　　┃　　　　　　　┏┛
 * 　　　　┗┓┓┏━┳┓┏┛
 * 　　　　　┃┫┫　┃┫┫
 * 　　　　　┗┻┛　┗┻┛
 * ━━━━━━永无BUG!━━━━━━
 *
 * @Description:
 * @Author：邢朋辉
 * @Date: 2023/5/4 16:39
 */
@Service
@Slf4j
public class SmsServiceImpl implements SmsService {
    @Autowired
    private StringRedisTemplate template;

    @Resource
    private SmsDao smsDao;
    @Resource
    private UserDao userDao;


    @Override
    public R sendRCode(String phone) {
        //1.校验
        if(StringUtils.hasLength(phone)){
            if(phone.matches("^1[3-9]\\d{9}$")){
                return sendCode(RedisKeyConfig.SMS_RCODE+phone,SmsType.注册.getValue(), "完成注册验证码的发送",phone);
            }
        }
        return R.fail("亲，验证码发送失败，请检查！");


    }

    @Override
    public R checkRCode(PhoneCodeBo bo) {
        //1.校验
        if(bo!=null && StringUtils.hasLength(bo.getPhone())){
            //2.检查是否存在验证码
            if(template.hasKey(RedisKeyConfig.SMS_RCODE +bo.getPhone())){
                //3.比较 验证码
                if(bo.getCode().equals(template.opsForValue().get(RedisKeyConfig.SMS_RCODE+bo.getPhone()))){
                    //4.成功 删除验证码
                    template.delete(RedisKeyConfig.SMS_RCODE+bo.getPhone());
                    //5.记录校验通过的手机号 Set类型
                    template.opsForSet().add(RedisKeyConfig.SMS_RCODE_CHECKED, bo.getPhone());
                    return R.ok();
                }
            }
        }
        return R.fail();
    }

    private R sendCode(String key,int type,String info,String phone){
        //2.生成随机的短信验证码
        int code= RandomUtil.randomInt(100000,999999);
        //3.发送验证码
//        if(AliSmsUtil.sendSms(phone,code)){
        if(true){
            //4.发送成功  记录验证码（有效期） Redis
            template.opsForValue().set(key,code+"",10, TimeUnit.MINUTES);
            //5.记录数据库
            smsDao.insert(new Sms(type, phone,info));
            log.warn("短信验证码："+code);
            return R.ok(code);
        }
        return R.fail("亲，短信发送异常！");
    }
    @Override
    public R sendLCode(String phone) {
        //1.校验
        if(StringUtils.hasLength(phone) && phone.matches("^1[3-9]\\d{9}$")){
            //2.查询并校验手机号 是不是存在
            if(userDao.selectOne(new LambdaQueryWrapper<User>().eq(User::getPhone,phone))!=null){
               return sendCode(RedisKeyConfig.SMS_LCODE+phone,SmsType.登录.getValue(), "实现登录验证码的发送",phone);
            }
        }
        return R.fail("亲，短信发送异常！");
    }

    @Override
    public R sendFCode(String phone) {
        //1.校验
        if(StringUtils.hasLength(phone)&& phone.matches("^1[3-9]\\d{9}$")){
            //2.查询数据库 验证是否为用户
            if(userDao.selectOne(new LambdaQueryWrapper<User>().eq(User::getPhone,phone))!=null){
                //3.发送验证码
                return sendCode(RedisKeyConfig.SMS_FCODE+phone,SmsType.密码找回.getValue(), "实现密码找回验证码的发送",phone);
            }
        }
        return R.fail();
    }
}
